import 'package:playtruly/common/services/http.dart';
import 'package:playtruly/common/models/index.dart';
import 'dart:developer' as developer;
import 'dart:convert'; // 添加JSON编码支持
import '../utils/encryption_util.dart';

/// 积分相关API
class PointsApi {
  /// 获取积分套餐列表
  /// 根据接口文档 5.1 获取积分套餐列表
  /// POST /api/points/packages/
  static Future<PointsPackageResponse> getPointsPackages() async {
    try {
      developer.log('🔄 =============== 开始获取积分套餐列表（AES加密） ===============');

      // 创建加密载荷（空数据也需要加密）
      final encryptedPayload = EncryptionUtil.createEncryptedPayload({});
      
      developer.log('🚀 准备发送加密请求到: /api/points/packages/');
      developer.log('📦 请求载荷: ${encryptedPayload.toString()}');

      final response = await HttpService.to.post(
        '/api/points/packages/',
        data: encryptedPayload,
      );

      developer.log('📨 服务器响应: $response');

      // 尝试解析响应
      final packageResponse = PointsPackageResponse.fromJson(response);
      
      developer.log('✅ 积分套餐列表获取成功（AES加密）');
      developer.log('🏁 =============== 积分套餐获取完成 ===============');

      return packageResponse;
    } catch (e) {
      developer.log('💥 获取积分套餐列表异常: $e');
      
      // 返回错误响应
      return PointsPackageResponse(
        status: 'error',
        message: '获取积分套餐失败: ${e.toString()}',
        packages: [],
      );
    }
  }

  /// 创建支付宝支付订单
  /// 根据接口文档 5.2 创建支付宝支付订单
  /// POST /api/payment/alipay/create_app_order
  /// 🔐 必须使用AES加密（与MyApplication2保持一致）
  static Future<Map<String, dynamic>> createAlipayOrder({
    required int userId,
    required int packageId,
  }) async {
    try {
      developer.log('🔄 =============== 开始创建支付宝订单（AES加密） ===============');
      developer.log('👤 用户ID: $userId, 📦 套餐ID: $packageId');

      // 创建请求数据（与MyApplication2保持一致）
      final requestData = {
        'user_id': userId.toString(),  // 🔥 与MyApplication2保持一致：字符串格式
        'package_id': packageId,
        // timestamp 将由 EncryptionUtil.createEncryptedPayload 自动添加
      };
      
      developer.log('📊 请求参数（加密前）: ${jsonEncode(requestData)}');
      developer.log('📊 字段详情:');
      requestData.forEach((key, value) {
        developer.log('   - $key: $value (${value.runtimeType})');
      });
      
      // 🔐 使用AES加密（修复关键问题！）
      developer.log('🔐 开始AES加密支付宝订单数据...');
      final encryptedPayload = EncryptionUtil.createEncryptedPayload(requestData);
      
      developer.log('🚀 准备发送加密请求到: /api/payment/alipay/create_app_order');
      developer.log('📦 加密载荷: $encryptedPayload');

      final response = await HttpService.to.post(
        '/api/payment/alipay/create_app_order',
        data: encryptedPayload,
      );

      developer.log('📨 服务器响应: $response');
      developer.log('✅ 支付宝订单创建成功（AES加密）');
      developer.log('🏁 =============== 支付订单创建完成 ===============');
      
      return response;
    } catch (e) {
      developer.log('💥 创建支付宝订单异常: $e');
      return {
        'status': 'error',
        'message': '创建支付订单失败: ${e.toString()}',
      };
    }
  }

  /// 查询充值记录
  /// 根据接口文档 5.3 查询充值记录
  /// POST /api/payment/records/
  static Future<Map<String, dynamic>> getPaymentRecords({
    required int userId,
    int page = 1,
    int pageSize = 10,
  }) async {
    try {
      developer.log('🔄 =============== 开始查询充值记录（AES加密） ===============');
      developer.log('📊 用户ID: $userId, 页码: $page, 每页数量: $pageSize');

      // 创建加密载荷（timestamp将由EncryptionUtil自动添加）
      final requestData = {
        'user_id': userId.toString(),  // 🔥 修复：转换为字符串，与MyApplication2保持一致
        'page': page,
        'page_size': pageSize,
      };
      
      final encryptedPayload = EncryptionUtil.createEncryptedPayload(requestData);
      
      developer.log('🚀 准备发送加密请求到: /api/payment/records/');
      developer.log('📦 请求载荷: ${encryptedPayload.toString()}');

      final response = await HttpService.to.post(
        '/api/payment/records/',
        data: encryptedPayload,
      );

      developer.log('📨 服务器响应: $response');
      developer.log('✅ 充值记录查询成功（AES加密）');
      developer.log('🏁 =============== 充值记录查询完成 ===============');
      
      return response;
    } catch (e) {
      developer.log('💥 查询充值记录异常: $e');
      return {
        'status': 'error',
        'message': '查询充值记录失败: ${e.toString()}',
      };
    }
  }

  /// 查询用户积分变更历史（使用AES加密）
  /// 根据接口文档 5.6 查询用户积分变更历史
  /// POST /user/points/history
  static Future<Map<String, dynamic>> getPointsHistory({
    required int userId,
    int page = 1,
    int pageSize = 20,
    int? changeType, // 可选的变动类型过滤
  }) async {
    try {
      developer.log('🔄 =============== 开始查询积分变更历史（AES加密） ===============');
      developer.log('📊 用户ID: $userId (${userId.runtimeType}), 页码: $page, 每页数量: $pageSize');

      final requestData = {
        'userid': userId.toString(),  // 🔥 严格按照MyApplication2实现：使用userid字段名
        'page': page,
        // 注意：MyApplication2中没有发送page_size参数，所以这里也不发送
      };

      // 如果有变动类型筛选，添加到请求中
      if (changeType != null) {
        requestData['change_type'] = changeType;
        developer.log('🔍 变动类型过滤: $changeType');
      }
      
      developer.log('📊 请求参数（加密前）: ${jsonEncode(requestData)}');
      developer.log('📊 字段详情:');
      requestData.forEach((key, value) {
        developer.log('   - $key: $value (${value.runtimeType})');
      });
      
      // 🔥 使用AES加密
      developer.log('🔐 开始AES加密积分历史查询数据...');
      final encryptedPayload = EncryptionUtil.createEncryptedPayload(requestData);
      
      developer.log('🚀 准备发送加密请求到: /user/points/history');

      final response = await HttpService.to.post(
        '/user/points/history',
        data: encryptedPayload,
      );

      developer.log('📨 服务器响应: $response');
      developer.log('✅ 积分变更历史查询成功（AES加密）');
      developer.log('🏁 =============== 积分变更历史查询完成 ===============');
      
      return response;
    } catch (e) {
      developer.log('💥 查询积分变更历史异常: $e');
      return {
        'status': 'error',
        'message': '查询积分变更历史失败: ${e.toString()}',
      };
    }
  }
}
